home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 17 / CU Amiga Magazine's Super CD-ROM 17 (1997)(EMAP Images)(GB)[!][issue 1997-12].iso / CUCD / Programming / DiceSource / src / dc1 / sem.c < prev    next >
C/C++ Source or Header  |  1997-09-09  |  3KB  |  167 lines

  1. /*
  2.  *    (c)Copyright 1992-1997 Obvious Implementations Corp.  Redistribution and
  3.  *    use is allowed under the terms of the DICE-LICENSE FILE,
  4.  *    DICE-LICENSE.TXT.
  5.  */
  6.  
  7. /*
  8.  *  SEM.C
  9.  *
  10.  *  Semantics junk.  Doesn't let you overload reserved tokens (that have no
  11.  *  semantic lists and are not TokId)
  12.  */
  13.  
  14. #include "defs.h"
  15.  
  16. static short SemLevel = 0;
  17. static SemInfo *MasterBase;
  18.  
  19. Prototype void SemanticLevelDown(void);
  20. Prototype void SemanticLevelUp(void);
  21. Prototype void SemanticAddTop(Symbol *, short, void *);
  22. Prototype void SemanticAddTopBlock(Symbol *, short, void *);
  23. Prototype void SemanticAdd(Symbol *, short, void *);
  24.  
  25. void
  26. SemanticLevelDown()
  27. {
  28.     ++SemLevel;
  29. }
  30.  
  31. void
  32. SemanticLevelUp()
  33. {
  34.     SemInfo *sem;
  35.     Symbol *sym;
  36.  
  37.     while ((sem = MasterBase) && sem->SemLevel == SemLevel) {
  38.     MasterBase = sem->MasterNext;
  39.     if (sem->Next)
  40.         sem->Next->Prev = sem->Prev;
  41.     sym = sem->Sym;
  42.     if (sym->SemBase == (void *)sem && (sem->LexId & TOKF_PRIVATE) == 0) {
  43.         if (sem->Next) {
  44.         sym->LexId= sem->Next->LexId;
  45.         sym->Data = sem->Next->Data;
  46.         } else {
  47.         sym->LexId= TokId;
  48.         sym->Data = NULL;
  49.         }
  50.     }
  51.     *sem->Prev = sem->Next;
  52.     /*zfree(sem);*/
  53.     }
  54.     --SemLevel;
  55. }
  56.  
  57. void
  58. SemanticAddTop(Symbol *sym, short lexid, void *data)
  59. {
  60.     SemInfo *sem = AllocStructure(SemInfo);
  61.  
  62.     sem->Sym = sym;
  63.     sem->LexId = lexid;
  64.     sem->Data  = data;
  65.  
  66.     {
  67.     SemInfo **sp;
  68.     for (sp = &MasterBase; *sp; sp = &(*sp)->MasterNext);
  69.     sem->MasterNext = *sp;
  70.     sem->SemLevel = 1;
  71.     *sp  = sem;
  72.     }
  73.     {
  74.     SemInfo **sp;
  75.     for (sp = (SemInfo **)&sym->SemBase; *sp; sp = &(*sp)->Next);
  76.     sem->Prev = sp;
  77.     sem->Next = NULL;
  78.     *sp  = sem;
  79.     }
  80.     if ((lexid & TOKF_PRIVATE) == 0 && sym->SemBase == (void *)sem) {
  81.     sym->LexId = sem->LexId;
  82.     sym->Data  = sem->Data;
  83.     }
  84. }
  85.  
  86. void
  87. SemanticAddTopBlock(Symbol *sym, short lexid, void *data)
  88. {
  89.     SemInfo *sem = AllocStructure(SemInfo);
  90.  
  91.     sem->Sym = sym;
  92.     sem->LexId = lexid;
  93.     sem->Data  = data;
  94.     sem->SemLevel = 2;
  95.  
  96.     {
  97.     SemInfo **sp;
  98.     SemInfo *s;
  99.  
  100.     for (sp = &MasterBase; (s = *sp) != NULL; sp = &s->MasterNext) {
  101.         if (s->SemLevel <= 2)
  102.         break;
  103.     }
  104.     sem->MasterNext = *sp;
  105.     *sp  = sem;
  106.     }
  107.     {
  108.     SemInfo **sp;
  109.     SemInfo *s;
  110.     for (sp = (SemInfo **)&sym->SemBase; (s = *sp) != NULL; sp = &s->Next) {
  111.         if (s->SemLevel <= 2)
  112.         break;
  113.     }
  114.     sem->Prev = sp;
  115.     sem->Next = *sp;
  116.     *sp  = sem;
  117.     }
  118.     if ((lexid & TOKF_PRIVATE) == 0 && sym->SemBase == (void *)sem) {
  119.     sym->LexId = sem->LexId;
  120.     sym->Data  = sem->Data;
  121.     }
  122. }
  123.  
  124.  
  125. void
  126. SemanticAdd(Symbol *sym, short lexid, void *data)
  127. {
  128.     SemInfo *sem;
  129.  
  130.     if (SemLevel > 1)
  131.     sem = AllocTmpStructure(SemInfo);
  132.     else
  133.     sem = AllocStructure(SemInfo);
  134.  
  135.  
  136.     sem->Sym = sym;
  137.     if ((lexid & TOKF_PRIVATE) == 0) {
  138.     sym->LexId = sem->LexId = lexid;
  139.     sym->Data  = sem->Data    = data;
  140.     }
  141.  
  142.     sem->SemLevel = SemLevel;
  143.     sem->MasterNext = MasterBase;
  144.     sem->Next = (SemInfo *)sym->SemBase;
  145.     sem->Prev = (SemInfo **)&sym->SemBase;
  146.     MasterBase = sem;
  147.  
  148.     /*
  149.      *    check for duplicate symbols at same semantic level and for
  150.      *    overides of procedure arguments
  151.      */
  152.  
  153.     {
  154.     SemInfo *scan;
  155.  
  156.     for (scan = sem->Next; scan; scan = scan->Next) {
  157.         if (scan->SemLevel == sem->SemLevel)
  158.         zerror(EWARN_DUPLICATE_SYMBOL, sym->Len, sym->Name);
  159.         else if (scan->SemLevel == 2)
  160.         zerror(EWARN_VARIABLE_OVERIDES_ARG, sym->Len, sym->Name);
  161.     }
  162.     }
  163.  
  164.     sym->SemBase = (void *)sem;
  165. }
  166.  
  167.